// 用于组件事件传递

import { useEffect, useRef } from 'react';

const useEventEmitter = () => {
    const deps = useRef({ // 收集订阅
        value: [],
        isFirstRender: true, // 第一次render
        finishRender: false, // render 完成
    });
    // re render时候不重复创建
    const eventEmitter = useRef({
        emit: (...args) => { // 触发事件
            deps.current.value.map(dep => dep && dep(...args));
        },
        useSubscription: (watcher) => { // 添加订阅
            if (deps.current.isFirstRender) { // 首次render添加
                deps.current.value.push(watcher);
            }
            if (deps.finishRender) { // render完成添加报错
                console.error('useEventEmitter err:render完成后不允许添加订阅！！！');
            }
        },
    });
    deps.finishRender = false;
    useEffect(() => {
        if (deps.current.isFirstRender) {
            deps.current.isFirstRender = false;
        }
        deps.finishRender = true;
    });
    return eventEmitter.current;
};
export default useEventEmitter;

